// function onResolve(id) {
//   setTimeout(console.log, 0, id, 'resolved')
// }

// function onReject(id) {
//   setTimeout(console.log, 0, id, 'reject')
// }
// let p1 = new Promise((resolve, reject) => {
//   setTimeout(resolve, 3000)
// });
// let p2 = new Promise((resolve, reject) => {
//   setTimeout(reject, 3000);
// })
// p1.then(() => {
//   onResolve('p1'), () => {
//     onReject('p1')
//   }
// })
// p2.then(() => {
//   onResolve('p2')
// }, () => {
//   onReject('p2')
// });
// p1.then('abc')
// p2.then(null, () => {
//   onReject('p2p2')
// })


// let p3 = new Promise((resolve, reject) => {
//   resolve();
// });
// let p4 = p3.then();
// setTimeout(console.log, 0, p3);
// setTimeout(console.log, 0, p4);
// setTimeout(console.log, 0, p3 === p4);

// let p10 = p1.then(() => {
//   throw 'hello world';
// })
// setTimeout(console.log, 0, p10);
// let p1 = Promise.resolve('first');
// setTimeout(console.log, 0, p1);
// let p2 = p1.then(() =>
//   new Promise(() => {})
// )
// setTimeout(console.log, 0, p2);
// let p3 = p1.then(() => Promise.reject('smith'));
// setTimeout(console.log, 0, p3);
// let p4 = p1.then(() => {
//   throw 'mistake1'
// });
// setTimeout(console.log, 0, p4);
// let p5 = p1.then(() => Error('errorsss'));
// setTimeout(console.log, 0, p5);
// let p2 = p1.then(() => {
//   new Promise(() => {})
// });
// let p3 = p1.then(() => {
//   throw 'hello world';
// })
// let p4 = p1.then(() => {
//   Error('zhwo')
// })
// setTimeout(console.log, 0, p1)
// setTimeout(console.log, 0, p2)
// setTimeout(console.log, 0, p3)
// setTimeout(console.log, 0, p4)

// let p1 = Promise.reject('second');
// let p2 = p1.then();
// setTimeout(console.log, 0, p2)
// let p3 = p1.then(null, () => undefined);
// setTimeout(console.log, 0, p3);
// let p4 = p1.then(null, () => {});
// setTimeout(console.log, 0, p4);
// let p5 = p1.then(null, () => Promise.resolve());
// setTimeout(console.log, 0, p5);
// let p6 = p1.then(null, () => 'bar');
// setTimeout(console.log, 0, p6);
// let p7 = p1.then(null, () => Promise.resolve('foo'));
// setTimeout(console.log, 0, p7);
// let p8 = p1.then(null, () => new Promise(() => {}));
// setTimeout(console.log, 0, p8);
// let p9 = p1.then(null, () => Promise.reject('rejected'));
// setTimeout(console.log, 0, p9);
// let p10 = p1.then(null, () => {
//   throw 'HAHAHA'
// });
// setTimeout(console.log, 0, p10);
// let p11 = p1.then(null, () => Error('Err'));
// setTimeout(console.log, 0, p11);
// let p12 = p1.then(null, () => {
//   Error('Error')
// });
// setTimeout(console.log, 0, p12);

// console.log('===============catch=======================================');
// let p1 = new Promise((resolve, reject) => reject());

// function onReject(e) {
//   setTimeout(console.log, 0, e, 'onReject');
// }
// p1.catch(() => {
//   onReject('catch')
// });
// p1.then(null, () => onReject('then'))

// let p2 = new Promise(() => {});
// let p3 = p2.catch();
// setTimeout(console.log, 0, p2);
// setTimeout(console.log, 0, p3);
// setTimeout(console.log, 0, p2 === p3);

// let p4 = Promise.resolve();
// let p5 = Promise.reject();

// function onFinally() {
//   setTimeout(console.log, 0, 'onFinally')
// }
// let p41 = p4.finally(onFinally);
// let p51 = p5.finally(onFinally);
// setTimeout(console.log, 0, p41);
// setTimeout(console.log, 0, p51);
// let p1 = Promise.resolve('foo');
// let p2 = p1.finally();
// setTimeout(console.log, 0, p2);
// let p3 = p1.finally(() => undefined);
// setTimeout(console.log, 0, p3);
// let p4 = p1.finally(() => {});
// setTimeout(console.log, 0, p4);
// let p5 = p1.finally(() => Promise.resolve());
// setTimeout(console.log, 0, p5);
// let p6 = p1.finally(() => 'bar');
// setTimeout(console.log, 0, p6);
// let p7 = p1.finally(() => Error('hello'));
// setTimeout(console.log, 0, p7);
// let p8 = p1.finally(() => {
//   throw 'errors'
// });
// setTimeout(console.log, 0, p8);
// let p9 = p1.finally(() => Promise.reject('reject'));
// setTimeout(console.log, 0, p9);
// let p10 = p1.finally(() => new Promise(() => {}));
// setTimeout(console.log, 0, p10);
// console.log('====================================');

// let p1 = Promise.resolve('foo');
// let p2 = p1.finally(() => new Promise((resolve, reject) => setTimeout(() => resolve(), 500)));
// setTimeout(console.log, 0, p2);
// setTimeout(() => setTimeout(console.log, 0, p2), 1000);


// let p = Promise.resolve();
// p.then(() => {
//   console.log('console.log,resolve');
// });
// console.log('then last');

// let func;
// let p = new Promise((resolve) => {
//   console.log('0：Promise executes function()');
//   func = function () {
//     console.log('1：involving resolve');
//     resolve();
//     console.log('2：resolve() return');
//   };
// });
// p.then(() => {
//   console.log('4：handle executes')
// });
// func();
// console.log('3：func() returns');
// func();

// let p1 = Promise.resolve();
// p1.then(() => {
//   console.log('p1.then onResolved');
// });
// console.log('p1.then onResolved returns');

// let p2 = Promise.reject();
// p2.then(null, () => {
//   console.log('p2.then onRejected');
// })
// console.log('p2.then onRejected returns ');

// let p3 = Promise.reject();
// p2.catch(() => {
//   console.log('p3.catch onRejected');
// });
// console.log('p3.catch onRejected returns');

// let p4 = Promise.resolve();
// p4.finally(() => {
//   console.log('p4.finally onRejected');
// });
// console.log('p4.finally onRejected returns');

// let p1 = new Promise((resolve, reject) => {
//   resolve('resolve-foo')
// });
// p1.then((value) => console.log(value));
// let p2 = new Promise((resolve, reject) => {
//   reject('reject-foo')
// });
// p2.then(null, (value) => console.log(value));
// p2.catch((value) => {
//   console.log(value)
// });
// let p0 = new Promise((resolve, reject) => {
//   resolve(Error('foo'))
// })
// let p1 = new Promise((resolve, reject) => {
//   throw Error('foo')
// })
// let p2 = new Promise((resolve, reject) => {
//   reject(Error('foo'))
// })
// let p3 = Promise.resolve().then(() => {
//   throw Error('foo')
// });
// let p4 = Promise.reject(Error('foo'))
// console.log(p0);
// console.log(p1);
// console.log(p2);
// console.log(p3);
// console.log(p4);

// let p = Promise.reject(Error('hello world'));
// // console.log(p);
// console.log('hello world');

// throw Error('first');
// console.log('second');

// let p = Promise.reject(Error('error')).catch((e) => {
//   console.log(e);
// })
// console.log('p-----', p);

// console.log('error begin');
// try {
//   throw Error('error')
// } catch (e) {
//   console.log('caught error');
// }
// console.log('error end');

// new Promise((resolve, reject) => {
//   console.log('beging error');
//   reject(Error('error'))
// }).catch(e => {
//   console.log('caught error' + e);
// }).then(res => {
//   console.log('end error==' + res)
// })

// let p = new Promise((resolve, reject) => {
//   console.log('first');
//   resolve();
// })
// p.then(() => {
//     console.log('second');
//   })
//   .then(() => {
//     console.log('third');
//   })
//   .then(() => {
//     console.log('forth');
//   })
// ((i) => {
//   console.log('first--' + i);
// })(1);
// ((i) => {
//   console.log('second--' + i);
// })(2);
// ((i) => {
//   console.log('third--' + i);
// })(3)

// let p = new Promise((resolve, reject) => {
//   console.log('p1 executor');
//   setTimeout(resolve, 2000);
// }).then(() => {
//   return new Promise((resolve, reject) => {
//     console.log('p2 executor');
//     setTimeout(resolve, 4000)
//   })
// }).then(() => {
//   new Promise((resolve, reject) => {
//     console.log('p3 executor');
//     setTimeout(resolve, 6000);
//   })
// }).then((res) => {
//   new Promise((resolve, reject) => {
//     console.log('p4 executor', res);
//     setTimeout(resolve, 8000)
//   })
// })

// let p1 = new Promise((resolve, reject) => {
//   console.log('p1 executor');
//   setTimeout(resolve, 1000);
// });
// p1.then(() => new Promise((resolve, reject) => {
//     console.log('p2 executor');
//     setTimeout(resolve, 1000);
//   }))
//   .then(() => new Promise((resolve, reject) => {
//     console.log('p3 executor');
//     setTimeout(resolve, 1000);
//   }))
//   .then(() => new Promise((resolve, reject) => {
//     console.log('p4 executor');
//     setTimeout(resolve, 1000);
//   }));

// function developResolve(str) {
//   return new Promise((resolve, reject) => {
//     console.log(str);
//     setTimeout(resolve, 1000);
//   })
// }
// developResolve('p1 executor')
//   .then((res) => {
//     return developResolve('p2 executor');
//   }).then(() => {
//     return developResolve('p3 executor');
//   }).then(() => {
//     return developResolve('p4 executor');
//   }).then(() => {
//     return developResolve('p5 executor');
//   })

// function developRsolveCallback(str, callback = null) {
//   console.log(str);
//   setTimeout(() => {
//     callback && callback();
//   }, 1000);
// }
// developRsolveCallback('p1 callback', () => {
//   developRsolveCallback('p2 callback', () => {
//     developRsolveCallback('p3 callback', () => {
//       developRsolveCallback('p4 callback', null)
//     })
//   })
// })

// let p = new Promise((resolve, reject) => {
//   console.log('initial Promise reject');
//   reject();
// })
// p.catch(() => {
//   console.log('reject handler');
// }).then(() => {
//   console.log('resolve handler');
// }).finally(() => {
//   console.log('finally handler');
// })

// let p = Promise.all([Promise.resolve(), Promise.resolve()]);
// let p1 = Promise.all([1, 2]);
// let p2 = Promise.all([]);
// // let p3 = Promise.all();
// let p4 = Promise.all([Promise.resolve(), new Promise((resolve, reject) => {
//   setTimeout(resolve, 3000);
// })]);
// setTimeout(console.log, 0, p4);
// p4.then(() => {
//   setTimeout(console.log, 0, p4);
// })

// let p = Promise.all([
//   [Promise.resolve(), new Promise((resolve, reject) => {})]
// ])
// console.log(p);

// let p2 = Promise.all([
//   Promise.resolve(),
//   Promise.reject(),
//   // Promise.resolve()
//   new Promise((resolve, reject) => {})
// ]);
// setTimeout(console.log, 0, p2); // Promise <rejected>

// let p3 = Promise.all([
//   Promise.resolve(8),
//   Promise.resolve(),
//   Promise.resolve('hello world')
// ])
// console.log(p3);
// p3.then((res) => {
//   console.log(res);
// })

// let p1 = Promise.resolve(8);
// console.log(p1);
// let p2 = new Promise((resolve, reject) => {
//   resolve(9);
// })
// console.log(p2);

// let p = Promise.all([
//   Promise.reject('5'),
//   Promise.reject('8'),
//   new Promise((resolve, reject) => {
//     reject('hello')
//   })
// ]);
// p.then(res => {
//   console.log(res);
// })

// let p = Promise.race([
//   Promise.resolve(1),
//   Promise.resolve(2)
// ])
// console.log(p);
// p.then((res)=>{
//   console.log(p);
// })
// let p1 = Promise.race([3,4]);
// p1.then(res=>{
//   console.log(p1 ,res);
// })
// let p = Promise.resolve();
// console.log(p);
// let p1 =  new Promise((resolve,reject)=>{
//   // resolve();
// })
// console.log(p1);
// let p = Promise.race([
//   Promise.resolve(3),
//   new Promise((resolve,reject)=>{
//     setTimeout(reject,5000);
//   })
// ])
// console.log(p);
// setTimeout(console.log,0,p);

// let p1 = Promise.race([
//   Promise.reject(4),
//   new Promise((resolve,reject)=>{
//     setTimeout(resolve,1000);
//   })
// ])
// console.log(p1);
// setTimeout(console.log,0,p1);

function addTwo(x){
  return x + 2;
}
function addThree(x){
  return x + 3;
}
function addFive(x){
  return x + 5;
}
function addTen(x){
  return Promise.resolve(x)
  .then(addTwo)
  .then(addThree)
  .then(addFive)
}
addTen(15).then(res=>{
  console.log(res);
})
